using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{



        public ColaboradorVO getColaborador(int? idColaborador)
        {
            return getColaborador(idColaborador, null);
        }

        public ColaboradorVO getColaborador(int? idColaborador, int? idCargo) 
        {
            return getColaborador(idColaborador, idCargo, null);
        }

        public ColaboradorVO getColaborador(int? idColaborador, int? idCargo, int? idDepto)
        {
            return getColaborador(idColaborador, idCargo, idDepto, null);
        }

        public ColaboradorVO getColaborador(int? idColaborador, int? idCargo, int? idDepto, int? idPessoa)
        {
            return getColaborador(idColaborador, idCargo, idDepto, idPessoa, null);
        }

        public ColaboradorVO getColaborador(int? idColaborador, int? idCargo, int? idDepto, int? idPessoa, int? idPessoaG)
        {
            return getColaborador(idColaborador, idCargo, idDepto, idPessoa, idPessoaG, null);
        }

        public ColaboradorVO getColaborador(int? idColaborador, int? idCargo, int? idDepto, int? idPessoa, int? idPessoaG, int? idFilial)
        {
            return getColaborador(idColaborador, idCargo, idDepto, idPessoa, idPessoaG, idFilial, null);
        }

        public ColaboradorVO getColaborador(int? idColaborador, int? idCargo, int? idDepto, int? idPessoa, int? idPessoaG, int? idFilial, bool? ativo)
		{
			ColaboradorVO colaboradorVO = null;
			List<ColaboradorVO> listColaboradorVOs = getColaboradors(idColaborador, idCargo, idDepto, idPessoa, idPessoaG, idFilial, ativo);
			if (listColaboradorVOs != null && listColaboradorVOs.Count > 0)
			{
				colaboradorVO = listColaboradorVOs[0];
			}
			return colaboradorVO;
		}

		public List<ColaboradorVO> getColaboradors()
		{
			return getColaboradors(null, null, null, null, null);
		}

		public List<ColaboradorVO> getColaboradors(int? idColaborador)
		{
			return getColaboradors(idColaborador, null, null, null, null);
		}

        public List<ColaboradorVO> getColaboradors(int? idColaborador, int? idCargo)
        {
            return getColaboradors(idColaborador, idCargo, null);
        }

        public List<ColaboradorVO> getColaboradors(int? idColaborador, int? idCargo, int? idDepto)
        {
            return getColaboradors(idColaborador, idCargo, idDepto, null);
        }

        public List<ColaboradorVO> getColaboradors(int? idColaborador, int? idCargo, int? idDepto, int? idPessoa)
        {
            return getColaboradors(idColaborador, idCargo, idDepto, idPessoa, null);
        }

        public List<ColaboradorVO> getColaboradors(int? idColaborador, int? idCargo, int? idDepto, int? idPessoa, int? idPessoaG)
        {
            return getColaboradors(idColaborador, idCargo, idDepto, idPessoa, idPessoaG, null);
        }

        public List<ColaboradorVO> getColaboradors(int? idColaborador, int? idCargo, int? idDepto, int? idPessoa, int? idPessoaG, int? idFilial)
        {
            return getColaboradors(idColaborador, idCargo, idDepto, idPessoa, idPessoaG, idFilial, null);
        }

        public List<ColaboradorVO> getColaboradors(int? idColaborador, int? idCargo, int? idDepto, int? idPessoa, int? idPessoaG, int? idFilial, bool? ativo)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT clb.idCargo as clb_idCargo, cgo.cargo as cgo_cargo, clb.idDepto as clb_idDepto, dpt.depto as dpt_depto, clb.idColaborador as clb_idColaborador, clb.idPessoa as clb_idPessoa, pes.pessoa as pes_pessoa, clb.idPessoaG as clb_idPessoaG, clb.ativo as clb_ativo, clb.Cadastro as clb_Cadastro, clb.CadastradoPor as clb_CadastradoPor, clb.Edicao as clb_Edicao, clb.EditadoPor as clb_EditadoPor  ");
			query.AppendLine("FROM colaborador as clb ");
            query.AppendLine("  LEFT OUTER JOIN cargo as cgo on clb.idCargo=cgo.idCargo ");
            query.AppendLine("      LEFT OUTER JOIN depto as dpt on clb.idDepto=dpt.idDepto  ");
            query.AppendLine("          LEFT OUTER JOIN pessoa as pes on clb.idPessoa=pes.idPessoa  ");
            query.AppendLine("              LEFT OUTER JOIN filial as fil on fil.idFilial=pes.idFilial  ");
            
            if (idCargo != null)
			{
				query.AppendLine(where + "clb.idCargo=@idCargo ");
				where = "AND ";
			}
			if (idDepto != null)
			{
				query.AppendLine(where + "clb.idDepto=@idDepto ");
				where = "AND ";
			}
			if (idColaborador != null)
			{
				query.AppendLine(where + "clb.idColaborador=@idColaborador ");
				where = "AND ";
			}
			if (idPessoa != null)
			{
				query.AppendLine(where + "clb.idPessoa=@idPessoa ");
				where = "AND ";
			}
			if (idPessoaG != null)
			{
				query.AppendLine(where + "clb.idPessoaG=@idPessoaG ");
				where = "AND ";
			}
            if (idFilial != null)
            {
                query.AppendLine(where + "fil.idFilial=@idFilial ");
                where = "AND ";
            }
            if (ativo != null)
            {
                query.AppendLine(where + "clb.ativo=@ativo ");
                where = "AND ";
            }


			query.AppendLine("ORDER BY clb.idColaborador ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idCargo!= null) cmd.Parameters.Add(getParameter(cmd, "@idCargo", idCargo));
			if (idDepto!= null) cmd.Parameters.Add(getParameter(cmd, "@idDepto", idDepto));
			if (idColaborador!= null) cmd.Parameters.Add(getParameter(cmd, "@idColaborador", idColaborador));
			if (idPessoa!= null) cmd.Parameters.Add(getParameter(cmd, "@idPessoa", idPessoa));
			if (idPessoaG!= null) cmd.Parameters.Add(getParameter(cmd, "@idPessoaG", idPessoaG));
            if (idFilial != null) cmd.Parameters.Add(getParameter(cmd, "@idFilial", idFilial));
            if (ativo != null) cmd.Parameters.Add(getParameter(cmd, "@ativo", ativo.Value ? "S" : "N"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<ColaboradorVO> listColaborador = new List<ColaboradorVO>();

				while (reader.Read())
				{
					ColaboradorVO colaboradorVO = ColaboradorVO.CreateVO();
					if (!reader.IsDBNull(reader.GetOrdinal("clb_idCargo")))
						colaboradorVO.idCargo = reader.GetInt32(reader.GetOrdinal("clb_idCargo"));
					if (!reader.IsDBNull(reader.GetOrdinal("cgo_cargo")))
						colaboradorVO.idCargoVO.cargo = reader.GetString(reader.GetOrdinal("cgo_cargo"));
					if (!reader.IsDBNull(reader.GetOrdinal("clb_idDepto")))
						colaboradorVO.idDepto = reader.GetInt32(reader.GetOrdinal("clb_idDepto"));
					if (!reader.IsDBNull(reader.GetOrdinal("dpt_depto")))
						colaboradorVO.idDeptoVO.depto = reader.GetString(reader.GetOrdinal("dpt_depto"));
					colaboradorVO.idColaborador = reader.GetInt32(reader.GetOrdinal("clb_idColaborador"));
					colaboradorVO.idPessoa = reader.GetInt32(reader.GetOrdinal("clb_idPessoa"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_pessoa")))
						colaboradorVO.idPessoaVO.pessoa = reader.GetString(reader.GetOrdinal("pes_pessoa"));
					if(!reader.IsDBNull(reader.GetOrdinal("clb_idPessoaG")))
                        colaboradorVO.idPessoaG = reader.GetInt32(reader.GetOrdinal("clb_idPessoaG"));
                    colaboradorVO.ativo  = reader.GetString(reader.GetOrdinal("clb_ativo")).Equals("S");
					colaboradorVO.cadastro = reader.GetDateTime(reader.GetOrdinal("clb_Cadastro"));
					colaboradorVO.cadastradoPor = reader.GetString(reader.GetOrdinal("clb_CadastradoPor"));
					colaboradorVO.edicao = reader.GetDateTime(reader.GetOrdinal("clb_Edicao"));
					colaboradorVO.editadoPor = reader.GetString(reader.GetOrdinal("clb_EditadoPor"));


					listColaborador.Add(colaboradorVO);
				}
				reader.Close();
				return listColaborador;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setColaborador(ColaboradorVO colaboradorVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE colaborador ");
			query.AppendLine("SET idCargo=@idCargo, idDepto=@idDepto, idPessoa=@idPessoa, idPessoaG=@idPessoaG, ativo=@ativo, Cadastro=@Cadastro, CadastradoPor=@CadastradoPor, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idColaborador=@idColaborador ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (colaboradorVO.idCargo == null)
				cmd.Parameters.Add(getParameter(cmd, "@idCargo", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idCargo", colaboradorVO.idCargo));
			if (colaboradorVO.idDepto == null)
				cmd.Parameters.Add(getParameter(cmd, "@idDepto", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idDepto", colaboradorVO.idDepto));
			cmd.Parameters.Add(getParameter(cmd, "@idColaborador", colaboradorVO.idColaborador));
			cmd.Parameters.Add(getParameter(cmd, "@idPessoa", colaboradorVO.idPessoa));
			cmd.Parameters.Add(getParameter(cmd, "@idPessoaG", colaboradorVO.idPessoaG));
            cmd.Parameters.Add(getParameter(cmd, "@ativo", (colaboradorVO.ativo == null ? " " : (colaboradorVO.ativo.Value ? "S" : "N"))));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", colaboradorVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", colaboradorVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", colaboradorVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", colaboradorVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newColaborador(ColaboradorVO colaboradorVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO colaborador ");
			query.AppendLine("  ( idCargo, idDepto, idPessoa, idPessoaG, ativo, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @idCargo, @idDepto, @idPessoa, @idPessoaG, @ativo, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (colaboradorVO.idCargo == null)
				cmd.Parameters.Add(getParameter(cmd, "@idCargo", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idCargo", colaboradorVO.idCargo));
			if (colaboradorVO.idDepto == null)
				cmd.Parameters.Add(getParameter(cmd, "@idDepto", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idDepto", colaboradorVO.idDepto));
			cmd.Parameters.Add(getParameter(cmd, "@idPessoa", colaboradorVO.idPessoa));
			cmd.Parameters.Add(getParameter(cmd, "@idPessoaG", colaboradorVO.idPessoaG));
            cmd.Parameters.Add(getParameter(cmd, "@ativo", (colaboradorVO.ativo == null ? " " : (colaboradorVO.ativo.Value ? "S" : "N"))));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", colaboradorVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", colaboradorVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", colaboradorVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", colaboradorVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('colaborador') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delColaborador(ColaboradorVO colaboradorVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM colaborador ");
			query.AppendLine("WHERE idColaborador=@idColaborador ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idColaborador", colaboradorVO.idColaborador));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountColaboradorxIdCargo(int? idCargo)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idCargo) as ocorrencias FROM colaborador WHERE IdCargo=@IdCargo ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdCargo", idCargo));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountColaboradorxIdDepto(int? idDepto)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idDepto) as ocorrencias FROM colaborador WHERE IdDepto=@IdDepto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdDepto", idDepto));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountColaboradorxIdPessoa(int? idPessoa)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idPessoa) as ocorrencias FROM colaborador WHERE IdPessoa=@IdPessoa ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdPessoa", idPessoa));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountColaboradorxIdPessoaG(int? idPessoaG)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idPessoaG) as ocorrencias FROM colaborador WHERE IdPessoaG=@IdPessoaG ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdPessoaG", idPessoaG));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
